import numpy as np
import cv2
import csv

# 读取CSV文件并保存为二维数组
def read_csv(filename):
    data = []
    with open(filename, 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            data.append([float(value) for value in row])
    return np.array(data)

# 计算二维数组的平均值和标准差
def calculate_stats(array):
    mean = np.mean(array)
    std_dev = np.std(array)
    return mean, std_dev

# 根据平均值标准差将数组映射到0-255区间
def map_to_0_255(array, mean, std_dev):
    min = mean - std_dev
    max = mean + std_dev
    print("mean - std_dev:" + str(min) + "mean + std_dev" + str(max))
    scaled_array = (array - min) / (max - min) * 255
    # np.clip()给定一个区间，区间外的值将剪裁到区间边缘。例如，如果指定了[0，1]的间隔，则小于0的值将变为0，大于1的值将变成1。
    return np.clip(scaled_array, 0, 255).astype(np.uint8)

# 根据数组最大值和最小值映射到0-255区间
def origin_to_0_255(array):
    # 将二维数组展开为一维数组
    flattened_array = [element for sublist in array for element in sublist]
    # 对展开后的数组进行排序
    sorted_array = sorted(flattened_array)
    # 计算数组长度
    array_length = len(sorted_array)
    # 计算前后子数组的索引
    front_index = int(0.001 * array_length)
    rear_index = int(0.999 * array_length)
    # 提取前后子数组
    front_subarray = sorted_array[:front_index]
    rear_subarray = sorted_array[rear_index:]
    print("frontSize" + str(len(front_subarray)) + "backSize" + str(len(rear_subarray)))
    # 取出前序子数组的最后一个元素
    min = front_subarray[-1]
    # 取出后序子数组的最后一个元素
    max = rear_subarray[0]
    print("afterProcessMin:" + str(min) + "afterProcessMax" + str(max))
    origin_array = (array - min) / (max - min) * 255
    # np.clip()给定一个区间，区间外的值将剪裁到区间边缘。例如，如果指定了[0，1]的间隔，则小于0的值将变为0，大于1的值将变成1。
    return np.clip(origin_array, 0, 255).astype(np.uint8)

# 将数组输出为图片并保存
def array_to_image(array, name):
    cv2.imwrite(name + '.jpg', array)  # 保存数组为图像文件

# 主函数
def main():
    # 读取CSV文件
    filename = '../detectCCD/20240419crossDefect100%.csv'  # 替换为你的CSV文件路径
    name = filename.split('.')[0]
    data_array = read_csv(filename)

    print("originMin:" + str(np.min(data_array)) + "originMax" + str(np.max(data_array)))

    # 计算平均值和标准差
    mean, std_dev = calculate_stats(data_array)

    #标准图片
    origin_array = origin_to_0_255(data_array)
    array_to_image(origin_array, name + 'origin')

    # 映射到0-255区间，并根据不同的Hz值输出图片
    for k in np.arange(0.2, 3.0, 0.6):
        scaled_array = map_to_0_255(data_array, mean, k * std_dev)
        # 将数组输出为图片并保存
        array_to_image(scaled_array, name + 'scale_' + str(k))

if __name__ == "__main__":
    main()
